﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using clEntidad;
using System.Net;
using System.Security.Principal;
using System.Net.Sockets;

namespace clBD
{
    public class BDUsuario:BDBase
    {
        public BDUsuario(OleDbConnection cn):base(cn){ }
        public BDUsuario(OleDbConnection cn, OleDbTransaction trx) : base(cn, trx) { }
        public Usuario getByLogin(String login)
        {
            Usuario elem = null;
            String query = "select id,clave,nombre,es_admin,caduco,activo from usuario where login='" + login + "'";
            OleDbDataReader dr = execDr(query);
            if (dr.Read())
            {
                elem = new Usuario();
                elem.id = dr.GetInt32(0);
                elem.login = login;
                elem.paswEncryp = dr.GetString(1);
                elem.nombre  = dr.GetString(2);
                if (dr.GetString(3) == "T")
                    elem.esAdmin = true;
                if (dr.GetString(4) == "T")
                    elem.esCaduco  = true;
                if (dr.GetString(5) == "T")
                    elem.activo = true;
            }
            return elem;
        }
        public Usuario get(int id)
        {
            Usuario elem = null;
            String query = "select login,clave,nombre,es_admin,caduco,activo from usuario where id=" + id.ToString();
            OleDbDataReader dr = execDr(query);
            if (dr.Read())
            {
                elem = new Usuario();
                elem.id = id;
                elem.login = dr.GetString(0);
                elem.paswEncryp = dr.GetString(1);
                elem.nombre = dr.GetString(2);
                if (dr.GetString(3) == "T")
                    elem.esAdmin = true;
                if (dr.GetString(4) == "T")
                    elem.esCaduco = true;
                if (dr.GetString(5) == "T")
                    elem.activo = true;
            }
            return elem;
        }
        public List<Usuario> getAll()
        {
            List<Usuario> elems = new List<Usuario>();
            String query = "select id,login,nombre,es_admin,caduco,activo from usuario";
            OleDbDataReader dr = execDr(query);
            while (dr.Read())
            {
                Usuario elem = new Usuario();
                elem.id = dr.GetInt32(0);
                elem.login = dr.GetString(1); ;
                elem.nombre = dr.GetString(2);
                if (dr.GetString(3) == "T")
                    elem.esAdmin = true;
                if (dr.GetString(4) == "T")
                    elem.esCaduco = true;
                if (dr.GetString(5) == "T")
                    elem.activo = true;
                elems.Add(elem);
            }
            return elems;
        }
        public Usuario add(Usuario elem, int idUsrAud)
        {
            elem.id = getSeq("SEQ_USR");
            String insert = "insert into usuario(id,login,nombre,clave,es_admin,caduco,activo,fec_cre,usr_cre)" +
                " values (" + elem.id.ToString() + ",'" + elem.login + "','" + elem.nombre + "','" + elem.paswEncryp + "','";
            
            if (elem.esAdmin)
                insert += "T',";
            else
                insert += "F',";

            if (elem.esCaduco)
                insert += "'T',";
            else
                insert += "'F',";

            if (elem.activo)
                insert += "'T',";
            else
                insert += "'F',";
            insert += "now," + idUsrAud.ToString() + ")";
            execute(insert);
            return elem;
        }
        public void update(Usuario elem,int idUsrAud)
        {
            StringBuilder update = new StringBuilder("update usuario set nombre='");
            update.Append(elem.nombre);
            update.Append("',es_admin='");
            if(elem.esAdmin)
                update.Append("T");
            else
                update.Append("F");
            update.Append("',activo='");
            if(elem.activo)
                update.Append("T");
            else
                update.Append("F");
            update.Append("',fec_mod=now,usr_mod=");
            update.Append(idUsrAud);
            update.Append(" where id=");
            update.Append(elem.id);
            execute(update.ToString());
        }
        public void activar(int id,bool activo, int idUsrAud)
        {
            String flag;
            if (activo)
                flag = "T";
            else
                flag = "F";
            StringBuilder update = new StringBuilder("update usuario set activo='");
            update.Append(flag);
            update.Append("',fec_mod=now,usr_mod=");
            update.Append(idUsrAud);
            update.Append(" where id=");
            update.Append(id);
            execute(update.ToString());
        }
        public void cambiaClave(int id,String nuevaClaveEnc,bool claveCaduca)
        {
            String update = "update usuario set clave='" + nuevaClaveEnc + "',fec_pwd=now,caduco=";
            if (claveCaduca)
                update += "'T'";
            else
                update += "'F'";
            update += " where id=" + id.ToString();
            execute(update);
        }
        public void editaClave(int id, String nuevaClaveEnc, bool claveCaduca,int idUsrAud)
        {
            StringBuilder update = new StringBuilder("update usuario set clave='");
            update.Append(nuevaClaveEnc);
            update.Append("',fec_pwd=now,fec_mod=now,caduco=");
            if (claveCaduca)
                update.Append("'T'");
            else
                update.Append("'F'");
            update.Append(",usr_mod=");
            update.Append(" where id=");
            update.Append(id);
            execute(update.ToString());
        }
        public int registrarIng(string login, bool estado, String mensaje)
        {
            int id = getSeq("SEQ_AUD_IN");
            StringBuilder insert = new StringBuilder("insert into ing_aud(id,login,fecha,estado,mensaje,ip,maquina,usr_dom) ");
            insert.Append(" values (" + id.ToString() + ",'" + login + "',now,");
            if (estado)
                insert.Append("'T','");
            else
                insert.Append("'F','");
            insert.Append(mensaje + "','");

            String maquina = Dns.GetHostName();
            IPHostEntry ipEntry = Dns.GetHostEntry(maquina);
            IPAddress[] addr = ipEntry.AddressList;
            String ip = "";
            for (int ix = 1; ix <= addr.Length; ix++)
            {
                IPAddress ipAdd =addr[addr.Length - ix];
                if (ipAdd.AddressFamily == AddressFamily.InterNetwork)
                {
                    ip = ipAdd.ToString();
                    break;
                }
            }
            string usr_dom = WindowsIdentity.GetCurrent().Name;
            insert.Append(ip);
            insert.Append("','");
            insert.Append(maquina);
            insert.Append("','");
            insert.Append(usr_dom);
            insert.Append("')");
            execute(insert.ToString());
            return id;
        }
        public void addLocal(int idUser, int idLocal)
        {
            StringBuilder insert = new StringBuilder("insert into locxusr(idUsr,idLoc) values(");
            insert.Append(idUser);
            insert.Append(",");
            insert.Append(idLocal);
            insert.Append(")");
            execute(insert.ToString());
        }
        public void delLocales(int id)
        {
            string delete = "delete from locxusr where idUsr=" + id.ToString();
            execute(delete);
        }
        public List<Local> getLocales(int id)
        {
            string query = "select idLoc from locxusr where idUsr=" + id.ToString();
            OleDbDataReader dr = execDr(query);
            List<Local> elems = new List<Local>();
            while (dr.Read())
            {
                Local elem = new Local();
                elem.id = dr.GetInt32(0);
                elems.Add(elem);
            }
            return elems;
        }
        public List<RegistroAcceso> getAccesos(int id)
        {
            string query = "select a.id,a.fecha,a.estado,a.usr_dom,a.ip,a.maquina,a.mensaje " 
                + " from ing_aud a, usuario u " 
                + " where a.login= u.login and u.id=" + id.ToString() 
                + " order by a.fecha desc";
            OleDbDataReader dr = execDr(query);
            List<RegistroAcceso> elems = new List<RegistroAcceso>();
            while (dr.Read())
            {
                RegistroAcceso elem = new RegistroAcceso();
                elem.id = dr.GetInt32(0);
                elem.fecha = dr.GetDateTime(1);
                if (dr.GetString(2).Equals("T"))
                    elem.ingreso = true;
                elem.usuarioSO = dr.GetString(3);
                elem.ip = dr.GetString(4);
                elem.pc = dr.GetString(5);
                elem.mensaje = dr.GetString(6);
            
                elems.Add(elem);
            }
            return elems;

        }
    }
}
